home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / netzwerk / pronet / pronet20.lha / ProNET / source / filesystem / pronet-handler.s < prev    next >
Encoding:
Text File  |  1995-06-22  |  28.2 KB  |  1,397 lines

  1. ;: pronet-handler.s
  2. ;:
  3. ;:
  4. ;: 19.07.1994    started..
  5.  
  6. ;: 17-04-1995    READ-Transfer umgebaut v34.0
  7. ;: 29-04-1995    EXAMINE-Packets neu programmiert v34.1
  8. ;: 18-06-1995    "+"-Exansion -> Unitnumber v34.2
  9.  
  10. DEBUG        equ    0
  11.  
  12.         include    "exec/exec.i"
  13.         include    "dos/dos.i"
  14.         include    "dos/dosextens.i"
  15.         include    "dos/filehandler.i"
  16.         include    "devices/timer.i"
  17.         include    "devices/input.i"
  18.         include    "devices/inputevent.i"
  19.         include    "A:ProNET/include/devices/pronet.i"
  20.         include    "A:OSmacros.i"
  21.  
  22.         include    "A:ProNET/source/network.i"
  23.  
  24.         include    "exec_lib.i"
  25.         include    "dos_lib.i"
  26.  
  27. ; -- Convert given BPTR to FileLock in FL->fl_Key data or NULL if FL=0
  28. ; -- Changes d0 !!
  29. GETsFL        macro        ;GETsFL dp_Arg1(a2),a0
  30.         GETBPTR    \1,\2
  31.         move.l    \2,d0
  32.         beq.s    .\@getsfl
  33.         move.l    fl_Key(\2),\2
  34. .\@getsfl
  35.         endm
  36.  
  37. ; -- Struktur zum Speichern der Volumes
  38.           STRUCTURE    PHVolNode,0
  39.         STRUCT    phvn_node,MLN_SIZE    ;zur Verkettung
  40.         APTR    phvn_doslist        ;*VolumeNode
  41.         BPTR    phvn_locklist        ;BPTR->LockList
  42.         BPTR    phvn_srvdoslist        ;BPTR->VolNode beim Server
  43.         LABEL    phvn_SIZEOF
  44.  
  45. j
  46.         IFNE    DEBUG
  47.         bsr    dinit
  48.         ENDC
  49.  
  50.         move.l    4.w,a6
  51.         move.l    ThisTask(a6),d0
  52.         move.l    d0,ourprocess
  53.         move.l    d0,a0
  54.         lea    pr_MsgPort(a0),a0
  55.         move.l    a0,ourport
  56.         move.b    MP_SIGBIT(a0),Signal.packet
  57.  
  58.         move.l    ourport(pc),a0
  59.         LIBCALL    WaitPort
  60.         bsr    GetPacket
  61.         move.l    d0,startuppacket
  62.         move.l    d0,a0
  63.         move.l    dp_Arg3(a0),a0
  64.         add.l    a0,a0
  65.         add.l    a0,a0
  66.         move.l    a0,devnode
  67.  
  68.         GETBPTR    dol_Startup(a0),a0
  69.         move.l    fssm_Unit(a0),d0
  70.         GETBPTR    fssm_Environ(a0),a0
  71.         tst.l    de_HighCyl(a0)
  72.         beq.s    .ok1
  73.         add.b    #"0",d0
  74.         move.b    d0,plusflag
  75.  
  76. .ok1        lea    dosname(pc),a1
  77.         moveq    #36,d0
  78.         jsr    -552(a6)
  79.         move.l    d0,dosbase
  80.         beq    nodos
  81.  
  82.         bsr    startpronet
  83.         tst.w    d0
  84.         bne    nopronet
  85.  
  86. ; jetzt neuen Handler anmelden.
  87.         move.l    pronetio(pc),a4
  88.         lea    sendbuf,a3
  89.         move.l    #ACTION_NEWHANDLER,(a3)+
  90.         move.l    IO_DEVICE(a4),a6
  91.         move.l    devnode(pc),a0
  92.         move.l    dn_Name(a0),a0
  93.         add.l    a0,a0
  94.         add.l    a0,a0
  95.         addq.l    #1,a0
  96.         lea    localbuf,a1
  97. .copyloc1    move.b    (a0)+,(a1)+
  98.         bne.s    .copyloc1
  99.         move.b    #":",-1(a1)
  100.         clr.b    (a1)
  101.         lea    localbuf,a0
  102.         LIBCALL    GetConfigString
  103.         move.l    d0,a1
  104.         move.l    d0,a0
  105. .cc1        move.b    (a0)+,(a3)+
  106.         bne.s    .cc1
  107.         move.l    a1,a0
  108.         LIBCALL    FreeConfigString
  109.         bsr    sendpnpacket
  110.  
  111.         move.l    pronetmsgport(pc),a0
  112.         move.l    4.w,a6
  113.         LIBCALL    WaitPort
  114.         move.l    pronetmsgport(pc),a0
  115.         LIBCALL    GetMsg
  116.         move.l    d0,actpronetmsg
  117.         move.l    d0,a2
  118.         lea    MN_SIZE+2(a2),a2
  119.         move.l    4(a2),d0
  120.         beq.s    .cc0
  121.         move.l    actpronetmsg(pc),a1
  122.         LIBCALL    ReplyMsg
  123.         bra    noserver
  124. .cc0        move.l    actpronetmsg(pc),a1
  125.         LIBCALL    ReplyMsg
  126.  
  127. ; alles klar jetzt..
  128.         move.l    devnode(pc),a0
  129.         move.l    ourport(pc),dol_Task(a0)
  130.         move.l    startuppacket(pc),a0
  131.         moveq    #DOSTRUE,d0
  132.         moveq    #0,d1
  133.         bsr    ReturnPacket    ;Startuppacket zurückgeben
  134.     IFNE    DEBUG
  135.     st    debok
  136.     ENDC
  137.  
  138.         bsr    Wait4Message
  139.  
  140.         clr.l    startuppacket    ;damit es nicht nochmal zurückgeht
  141.  
  142. noserver    bsr    stoppronet
  143.  
  144. nopronet    move.l    dosbase(pc),a1
  145.         move.l    4.w,a6
  146.         jsr    -414(a6)
  147. nodos        move.l    startuppacket(pc),d0
  148.         beq.s    .0
  149.         move.l    d0,a0
  150.         move.l    #DOSFALSE,d0
  151.         move.l    #ERROR_NO_FREE_STORE,d1
  152.         bsr    ReturnPacket
  153. .0        moveq    #0,d0
  154.         rts
  155.  
  156.         dc.b    "$VER: pronet-handler 34.2 (18-06-95)",13,10,0
  157.         even
  158.  
  159. startpronet    moveq    #pnr_Size,d0
  160.         bsr    GetIORequest
  161.         move.l    d0,pronetio
  162.         beq    spnoioreq
  163.         bsr    CreatePort
  164.         move.l    d0,pronetmsgport
  165.         beq    spnomsgport
  166.  
  167.         move.l    devnode(pc),a1        ;Device, Unit und Flags
  168.         move.l    dn_Startup(a1),a1    ;aus der Mountlist nehmen!!
  169.         add.l    a1,a1
  170.         add.l    a1,a1
  171.         move.l    fssm_Unit(a1),d0
  172.         move.l    fssm_Flags(a1),d1
  173.         move.l    fssm_Device(a1),a0
  174.         add.l    a0,a0
  175.         add.l    a0,a0
  176.         addq.w    #1,a0
  177.         move.l    pronetio(pc),a1
  178.         move.w    #PNP_NEXTFREE,pnr_NetSourcePort(a1)
  179.         move.l    pronetmsgport(pc),pnr_MsgPort(a1)
  180.         move.l    4.w,a6
  181.         LIBCALL    OpenDevice
  182.         tst.l    d0
  183.         bne    spnodev
  184.         move.l    pronetio(pc),a1
  185.         move.w    #CMD_WRITE,IO_COMMAND(a1)
  186.         clr.l    pnr_Length2(a1)
  187.         clr.w    pnr_NetDestPort(a1)
  188.         move.l    pronetmsgport(pc),a0
  189.         move.b    MP_SIGBIT(a0),Signal.pronet
  190.         moveq    #0,d0
  191.         rts
  192.  
  193. stoppronet    move.l    4.w,a6
  194.         move.l    pronetio(pc),a1
  195.         LIBCALL    CloseDevice
  196. spnodev        move.l    pronetmsgport(pc),a0
  197.         bsr    DeletePort
  198. spnomsgport    move.l    pronetio(pc),a0
  199.         bsr    FreeIORequest
  200. spnoioreq    moveq    #-1,d0
  201.         rts
  202.  
  203. w4mquitflag    dc.w    0
  204. Wait4Message    tst.w    w4mquitflag
  205.         bne    .quit
  206.         clr.w    w4mquitflag
  207.  
  208.         lea    Signals(pc),a3    * auf die Messages
  209.         moveq    #0,d0        * an allen möglichen
  210.         moveq    #numports-1,d1    * Ports warten
  211. .loop1        move.b    (a3),d2
  212.         bmi.s    .0
  213.         bset    d2,d0
  214. .0        addq.w    #6,a3
  215.         dbra    d1,.loop1
  216.         move.l    4.w,a6
  217.         LIBCALL    Wait
  218.                     * entsprechende Routinen
  219.         moveq    #31,d7        * aufrufen
  220. .00        rol.l    d0
  221.         bcc.s    .notthisbit
  222.         lea    Signals(pc),a3
  223.         moveq    #numports-1,d4
  224. .01        cmp.b    (a3),d7
  225.         bne.s    .notthisport
  226.         movem.l    d0/d4/d7/a3,-(sp)
  227.         move.l    2(a3),a3
  228.         jsr    (a3)
  229.         movem.l    (sp)+,d0/d4/d7/a3
  230. .notthisport    addq.w    #6,a3
  231.         dbra    d4,.01
  232. .notthisbit    dbra    d7,.00    
  233.  
  234.         bra    Wait4Message
  235. .quit        rts
  236. Signals:
  237. Signal.pronet    dc.b    -1,0            ;Signalbit
  238.         dc.l    GetProNETMsg        ;entsprechende Routine
  239. Signal.packet    dc.b    -1,0
  240.         dc.l    GetPacketMsg
  241. numports    equ    2
  242.  
  243. GetProNETMsg    move.l    pronetmsgport(pc),a0
  244.         move.l    4.w,a6
  245.         LIBCALL    GetMsg
  246.         move.l    d0,actpronetmsg
  247.         beq.s    GetPacketMsg    ;Ende !!
  248.         move.l    d0,a3
  249.         lea    MN_SIZE+2(a3),a3
  250.         move.l    (a3)+,d2
  251.         move.l    actpacket(pc),a2
  252.         cmp.l    #ACTION_DISKINS,d2
  253.         beq    ACT_DISKINS
  254.         cmp.l    #ACTION_DISKREM,d2
  255.         beq    ACT_DISKREM
  256.         move.l    actanswerroutine(pc),a0
  257.         jsr    (a0)
  258.         clr.l    actpacket
  259.  
  260.         move.l    actpronetmsg(pc),d0
  261.         beq.s    .0
  262.  
  263.         move.l    d0,a1
  264.         move.l    4.w,a6
  265.         LIBCALL    ReplyMsg
  266. .0        bra.s    GetProNETMsg
  267.  
  268. ; -- hier wird immer nur ein Packet geholt, dann auf die Abarbeitung ge-
  269. ; wartet und nachdem alle ProNETMsgs erledigt sind, wird nochmal versucht,
  270. ; ob hier Messages anliegen. Erst wenn beide Ports leer sind, wird der
  271. ; Task in Sleepstatus gelegt.
  272. GetPacketMsg
  273.         move.l    actpacket(pc),d0    ;Wird ein anderes Packet
  274.         bne.s    .ende        ;gerade bearbeitet ? --> Warten
  275.         move.l    4.w,a6
  276.         bsr    GetPacket
  277.         move.l    d0,actpacket
  278.         beq.s    .ende
  279.         move.l    d0,a2        ;[a2] DosPacket
  280.         move.l    dp_Action(a2),d0
  281.     IFNE    DEBUG
  282.     bsr    dcr
  283.     bsr    dtypedec
  284.     ENDC
  285.         lea    sendbuf,a3    ;[a3] sendbuf
  286.         move.l    d0,(a3)+
  287.         move.l    pronetio(pc),a4    ;[a4] PNRequest
  288.         lea    at(pc),a0
  289.         moveq    #atl-1,d1
  290. .findroutloop    cmp.l    (a0),d0
  291.         bcs.s    .next
  292.         cmp.l    4(a0),d0
  293.         bls.s    .jsrroutine
  294. .next        lea    12(a0),a0
  295.         dbra    d1,.findroutloop
  296.         bsr    ACT_NIL
  297.         bra.s    GetPacketMsg
  298. .jsrroutine    sub.l    (a0),d0
  299.         add.l    d0,d0
  300.         move.l    8(a0),a0
  301.         lea    at(pc),a1
  302.         add.w    (a0,d0.l),a1
  303.         jsr    (a1)
  304.         bra.s    GetPacketMsg
  305. .ende        rts
  306.  
  307.         cnop    0,4
  308. at        ;dc.l    lowerbound,upperbound,tableaddress
  309.         dc.l    7,34,actiontable1
  310.         dc.l    40,40,actiontable2
  311.         dc.l    82,82,actiontable3
  312.         dc.l    87,87,actiontable4
  313.         dc.l    1004,1008,actiontable5
  314.         dc.l    1020,1034,actiontable6
  315.         dc.l    2008,2009,actiontable7
  316.         dc.l    4097,4098,actiontable8
  317.         dc.l    4200,4200,actiontable9
  318. atl        equ    (*-at)/12
  319.  
  320. actiontable1    dc.w    ACT_CURRENT_VOLUME-at
  321.         dc.w    ACT_LOCATE_OBJECT-at,ACT_RENAME_DISK-at,ACT_NIL-at,ACT_NIL-at
  322.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_NIL-at,ACT_FREE_LOCK-at,ACT_DELETE_OBJECT-at
  323.         dc.w    ACT_RENAME_OBJECT-at,ACT_MORE_CACHE-at,ACT_COPY_DIR-at,ACT_NIL-at
  324.         dc.w    ACT_SET_PROTECT-at,ACT_CREATE_DIR-at,ACT_EXAMINE_OBJECT-at,ACT_EXAMINE_OBJECT-at
  325.         dc.w    ACT_DISK_INFO-at,ACT_INFO-at,ACT_FLUSH-at,ACT_SET_COMMENT-at
  326.         dc.w    ACT_PARENT-at,ACT_NIL-at,ACT_INHIBIT-at,ACT_NIL-at
  327.         dc.w    ACT_NIL-at,ACT_SET_DATE-at
  328. actiontable2    dc.w    ACT_SAME_LOCK-at
  329. actiontable3    dc.w    ACT_READ-at
  330. actiontable4    dc.w    ACT_WRITE-at
  331. actiontable5    dc.w    ACT_FINDxxx-at
  332.         dc.w    ACT_FINDxxx-at,ACT_FINDxxx-at,ACT_END-at,ACT_SEEK-at
  333. actiontable6    dc.w    ACT_FORMAT-at,ACT_MAKE_LINK-at,ACT_SET_FILE_SIZE-at,ACT_WRITE_PROTECT-at
  334.         dc.w    ACT_READ_LINK-at,ACT_NIL-at,ACT_FH_FROM_LOCK-at,ACT_IS_FILESYSTEM-at
  335.         dc.w    ACT_CHANGE_MODE-at,ACT_NIL-at,ACT_COPY_DIR_FH-at,ACT_PARENT_FH-at
  336.         dc.w    ACT_NIL-at,ACT_NIL-at,ACT_EXAMINE_FH-at
  337. actiontable7    dc.w    ACT_LOCK_RECORD-at,ACT_FREE_RECORD-at
  338. actiontable8    dc.w    ACT_ADD_NOTIFY-at,ACT_REMOVE_NOTIFY-at
  339. actiontable9    dc.w    ACT_SERIALIZE_DISK-at
  340.  
  341. ** The routines will be called with the registers containing following:
  342. ** a6 Execbase
  343. ** a4 PNRequest (pnr_NetDestPort is ready !)
  344. ** a3 sendbuf+4 (first long already contains dp_Action..)
  345. ** a2 DosPacket
  346.  
  347. ** Answerroutine will be called with:
  348. ** a6 Execbase
  349. ** a3 data received from server (without dp_Action -> Res1,Res2,Data..)
  350. ** a2 DosPacket to be returned
  351. ** d2 dp_Action
  352.  
  353. ACT_LOCATE_OBJECT
  354.         GETsFL    dp_Arg1(a2),a0
  355.         move.l    a0,(a3)+
  356.         move.l    dp_Arg3(a2),(a3)+
  357.         clr.w    (a3)+    ;muß beim Server LongWord-aligned
  358.         move.l    dp_Arg2(a2),a0    ;ankommen..
  359.         bsr    copybfname
  360.         lea    .ret(pc),a0
  361.         bra    sendpnpacket
  362. .ret
  363.         moveq    #0,d0
  364.         move.l    (a3)+,d2
  365.         beq    .return
  366.  
  367.         move.l    4(a3),d1
  368.         bsr    FindCorrVolume
  369.         move.l    d0,d3
  370.         move.l    a1,a4
  371.         move.l    #fl_SIZEOF,d0    ;neuen FileLock erstellen
  372.         bsr    AllocVec
  373.         move.l    d0,a0
  374.         move.l    dp_Arg3(a2),fl_Access(a0)
  375.         move.l    ourport(pc),fl_Task(a0)
  376.         move.l    d3,fl_Volume(a0)
  377.         move.l    d2,fl_Key(a0)    ;WICHTIG! um den FL auf dem
  378.                 ;Server wiederzufinden..
  379.         lsr.l    #2,d0
  380.         move.l    a4,a1
  381.         bsr    RememberLock
  382.  
  383.         ; BPTR auf Lock in d0 (first Result..)
  384. .return        move.l    (a3),d1
  385.         move.l    a2,a0
  386.         bra    ReturnPacket
  387.  
  388. ACT_RENAME_DISK
  389.         clr.w    (a3)+
  390.         move.l    dp_Arg1(a2),a0
  391.         bsr    copybstr
  392.         lea    .ret(pc),a0
  393.         bra    sendpnpacket
  394. .ret
  395.         move.l    (a3),d0
  396.         beq.s    .return
  397.         move.l    curvolume(pc),d2
  398.         beq.s    .return
  399.         move.l    4.w,a6
  400.         LIBCALL    Forbid
  401.         move.l    d2,a4
  402.         move.l    dol_Name(a4),a1
  403.         add.l    a1,a1
  404.         add.l    a1,a1
  405.         bsr    FreeVec
  406.         move.l    dp_Arg1(a2),a5
  407.         add.l    a5,a5
  408.         add.l    a5,a5
  409.         moveq    #0,d0
  410.         move.b    (a5),d0
  411.         addq.l    #2,d0
  412.         bsr    AllocVec
  413.         move.l    d0,a1
  414.         moveq    #0,d1
  415.         move.b    (a5),d1
  416.  
  417.         tst.w    plusflag
  418.         beq.s    .copyname
  419.         addq.w    #1,d1
  420.         move.b    d0,(a1)+
  421.         move.b    plusflag(pc),(a1)+
  422.         subq.w    #2,d1
  423.         addq.w    #1,a5
  424.  
  425. .copyname    move.b    (a5)+,(a1)+
  426.         dbra    d1,.copyname
  427.         clr.b    (a1)+
  428.         lsr.l    #2,d0
  429.         move.l    d0,dol_Name(a4)
  430.         LIBCALL    Permit
  431. .return        bra    normalret
  432.  
  433. ACT_FREE_LOCK
  434.         move.l    dp_Arg1(a2),d1    ;ZERO-Lock ? -> gleich zurück
  435.         beq.s    .return
  436.         bsr    ForgetLock
  437.         tst.l    d1
  438.         beq.s    .error
  439.         move.l    fl_Key(a5),(a3)+
  440.         bsr    sendpnpacket    ;auch auf dem Server löschen !
  441.         clr.l    fl_Task(a5)
  442.         move.l    a5,a1
  443.         bsr    FreeVec
  444. .return        moveq    #DOSTRUE,d0
  445.         bra.s    .ret2
  446. .error        moveq    #DOSFALSE,d0
  447.         move.l    #ERROR_INVALID_LOCK,d1
  448. .ret2        move.l    a2,a0
  449.         clr.l    actpacket
  450.         bra    ReturnPacket
  451.  
  452. ACT_DELETE_OBJECT
  453.         GETsFL    dp_Arg1(a2),a0
  454.         move.l    a0,(a3)+
  455.         clr.w    (a3)+
  456.         move.l    dp_Arg2(a2),a0
  457.         bsr    copybfname
  458.         lea    normalret(pc),a0
  459.         bra    sendpnpacket
  460.  
  461. ACT_RENAME_OBJECT
  462.         GETsFL    dp_Arg1(a2),a0
  463.         move.l    a0,(a3)+
  464.         GETsFL    dp_Arg3(a2),a0
  465.         move.l    a0,(a3)+
  466.         clr.w    (a3)+
  467.         lea    256(a3),a5
  468.         move.l    dp_Arg2(a2),a0
  469.         bsr    copybfname
  470.         move.l    a5,a3
  471.         move.l    dp_Arg4(a2),a0
  472.         bsr    copybfname
  473.         lea    normalret(pc),a0
  474.         bra    sendpnpacket
  475.  
  476. ACT_MORE_CACHE
  477.         move.l    dp_Arg1(a2),(a3)+
  478.         lea    normalret(pc),a0
  479.         bra    sendpnpacket
  480.  
  481. ACT_COPY_DIR
  482.         GETsFL    dp_Arg1(a2),a0
  483.         move.l    a0,(a3)+
  484.         lea    copydir_ret(pc),a0
  485.         bra    sendpnpacket
  486. copydir_ret
  487.         moveq    #0,d0
  488.         move.l    (a3)+,d2
  489.         beq.s    .return
  490.  
  491.         move.l    4(a3),d1
  492.         bsr    FindCorrVolume
  493.         move.l    d0,d3
  494.         move.l    a1,a4
  495.         moveq    #fl_SIZEOF,d0    ;neuen FileLock erstellen
  496.         bsr    AllocVec
  497.         move.l    d0,a0
  498.         move.l    8(a3),fl_Access(a0)
  499.         move.l    ourport(pc),fl_Task(a0)
  500.         move.l    d3,fl_Volume(a0)
  501.         move.l    d2,fl_Key(a0)    ;WICHTIG! um den FL auf dem
  502.                 ;Server wiederzufinden..
  503.         lsr.l    #2,d0
  504.         move.l    a4,a1
  505.         bsr    RememberLock
  506.  
  507. .return        move.l    (a3),d1
  508.         move.l    a2,a0
  509.         bra    ReturnPacket
  510.  
  511. ACT_SET_PROTECT
  512.         GETsFL    dp_Arg2(a2),a0
  513.         move.l    a0,(a3)+
  514.         move.l    dp_Arg4(a2),(a3)+
  515.         clr.w    (a3)+
  516.         move.l    dp_Arg3(a2),a0
  517.         bsr    copybfname
  518.         lea    normalret(pc),a0
  519.         bra    sendpnpacket
  520.  
  521. ACT_CREATE_DIR
  522.         GETsFL    dp_Arg1(a2),a0
  523.         move.l    a0,(a3)+
  524.         clr.w    (a3)+
  525.         move.l    dp_Arg2(a2),a0
  526.         bsr    copybfname
  527.         lea    copydir_ret(pc),a0
  528.         bra    sendpnpacket
  529.  
  530. ACT_EXAMINE_OBJECT    ;EXAMINEs neu 29-04-95
  531.         GETsFL    dp_Arg1(a2),a0
  532. act_ex_entry    move.l    a0,(a3)+
  533.         GETBPTR    dp_Arg2(a2),a0
  534.         move.l    (a0)+,(a3)+    ;fib_DiskKey übertragen
  535.         addq.l    #4,a0
  536.         move.w    #32/4-1,d0
  537. .copyname    move.l    (a0)+,(a3)+
  538.         dbra    d0,.copyname    ;fib_fileName übertragen
  539.         lea    act_ex_ret(pc),a0
  540.         bra    sendpnpacket
  541.  
  542. act_ex_ret    movem.l    (a3)+,d0/d1
  543.         GETBPTR    dp_Arg2(a2),a0
  544.         move.w    #fib_SIZEOF/4-1,d2
  545. .copyfib    move.l    (a3)+,(a0)+
  546.         dbra    d2,.copyfib
  547.         move.l    a2,a0
  548.         bra    ReturnPacket
  549.  
  550. ACT_EXAMINE_FH
  551.         move.l    dp_Arg1(a2),a0
  552.         bra.s    act_ex_entry
  553.  
  554. ACT_FLUSH
  555.         lea    normalret(pc),a0
  556.         bra    sendpnpacket
  557.  
  558. ACT_SET_COMMENT
  559.         GETsFL    dp_Arg2(a2),a0
  560.         move.l    a0,(a3)+
  561.         clr.w    (a3)+    ;LW-Alignment..
  562.         move.l    dp_Arg4(a2),a0
  563.         add.l    a0,a0
  564.         add.l    a0,a0
  565.         moveq    #80/4-1,d2
  566. .1        move.l    (a0)+,(a3)+
  567.         dbra    d2,.1
  568.         move.l    dp_Arg3(a2),a0
  569.         bsr    copybfname
  570.         lea    normalret(pc),a0
  571.         bra    sendpnpacket
  572.  
  573. ACT_PARENT
  574.         bra    ACT_COPY_DIR
  575.  
  576. ACT_SET_DATE
  577.         GETsFL    dp_Arg2(a2),a0
  578.         move.l    a0,(a3)+
  579.         move.l    dp_Arg4(a2),a0
  580.         move.l    (a0)+,(a3)+
  581.         move.l    (a0)+,(a3)+
  582.         move.l    (a0)+,(a3)+
  583.         clr.w    (a3)+
  584.         move.l    dp_Arg3(a2),a0
  585.         bsr    copybfname
  586.         lea    normalret(pc),a0
  587.         bra    sendpnpacket
  588.  
  589. ACT_SAME_LOCK
  590.         GETBPTR    dp_Arg1(a2),a0
  591.         GETBPTR    dp_Arg2(a2),a1
  592.         cmp.l    a0,a1
  593.         beq.s    .equal
  594.         move.l    fl_Volume(a0),d0
  595.         cmp.l    fl_Volume(a1),d0
  596.         bne.s    .not_equal
  597.         GETsFL    dp_Arg1(a2),a0
  598.         move.l    a0,(a3)+
  599.         GETsFL    dp_Arg2(a2),a0
  600.         move.l    a0,(a3)+
  601.         lea    normalret(pc),a0
  602.         bra    sendpnpacket
  603. .not_equal    moveq    #DOSFALSE,d0
  604.         moveq    #0,d1
  605. .return        move.l    a2,a0
  606.         clr.l    actpacket
  607.         bra    ReturnPacket
  608. .equal        moveq    #DOSTRUE,d0
  609.         bra.s    .return
  610.  
  611. ACT_READ    ** new routine 17-04-95
  612.         move.l    dp_Arg1(a2),(a3)+
  613.         move.l    dp_Arg3(a2),(a3)+
  614.         lea    .ret(pc),a0
  615.         bra    sendpnpacket
  616. .ret
  617.         move.l    dp_Arg2(a2),a4    * Destination Buffer
  618.         move.l    dp_Arg3(a2),d7    * Bytes to be read
  619.         moveq    #0,d6        * Bytes already read
  620.  
  621.         move.l    actpronetmsg(pc),d5 *current pronetmsg
  622.         bra.s    .jump_in
  623.  
  624. .loop        move.l    pronetmsgport(pc),a0    *Get the Message
  625.         LIBCALL    WaitPort
  626.         move.l    pronetmsgport(pc),a0
  627.         LIBCALL    GetMsg
  628.         move.l    d0,d5
  629. .jump_in    move.l    d5,a3
  630.         lea    MN_SIZE+6(a3),a3
  631.         move.l    (a3),d4
  632.         bmi.s    .ERROR            *Error?
  633.  
  634.         lea    8(a3),a0        *Copy
  635.         move.l    a4,a1
  636.         move.l    d4,d0
  637.         LIBCALL    CopyMem
  638.  
  639.         move.l    d5,a1
  640.         LIBCALL    ReplyMsg
  641.         clr.l    actpronetmsg
  642.  
  643.         tst.l    d4
  644.         beq.s    .EOF
  645.  
  646.         add.l    d4,d6
  647.         add.l    d4,a4
  648.         sub.l    d4,d7
  649.         bgt.s    .loop
  650.  
  651. .EOF        move.l    a2,a0
  652.         move.l    d6,d0
  653.         moveq    #0,d1
  654.         bra    ReturnPacket
  655.  
  656. .ERROR        movem.l    (a3),d2/d3
  657.         move.l    d5,a1
  658.         LIBCALL    ReplyMsg
  659.         clr.l    actpronetmsg
  660.         move.l    d2,d0
  661.         move.l    d3,d1
  662.         move.l    a2,a0
  663.         bra    ReturnPacket
  664.  
  665.  
  666. ACT_WRITE
  667.     IFNE    DEBUG
  668.     lea    dwritet(pc),a0
  669.     bsr    dtype
  670.     move.l    dp_Arg1(a2),d0
  671.     bsr    dtypehex
  672.     move.l    dp_Arg2(a2),d0
  673.     bsr    dtypehex
  674.     move.l    dp_Arg3(a2),d0
  675.     bsr    dtypehex
  676.     bsr    dcr
  677.     ENDC
  678.         move.l    dp_Arg1(a2),(a3)+
  679.         move.l    dp_Arg3(a2),(a3)+
  680.         lea    .ret(pc),a0
  681.         bra    sendpnpacket
  682. .ret
  683.         movem.l    (a3)+,d0/d1
  684.         cmp.l    #-1,d0
  685.         beq.s    .return
  686.  
  687.         move.l    dp_Arg3(a2),d4    ;Number of Bytes to be transferred
  688.         move.l    4.w,a6
  689.         move.l    pronetio(pc),a3
  690.         move.l    dp_Arg2(a2),a4
  691.  
  692. .sendloop    move.l    a4,pnr_Data1(a3)    ;Split chunk in parts
  693.         move.l    #MAXPACKETSIZE,d0    ;and send them..
  694.         cmp.l    d0,d4
  695.         bcc.s    .0
  696.         move.l    d4,d0
  697. .0        move.l    d0,pnr_Length1(a3)
  698.         add.l    d0,a4
  699.         sub.l    d0,d4
  700.         move.l    a3,a1
  701.         LIBCALL    DoIO
  702.     IFNE    DEBUG
  703.     move.l    pnr_Length1(a3),d0
  704.     bsr    dtypehex
  705.     bsr    dcr
  706.     ENDC
  707.         tst.l    d4
  708.         bgt.s    .sendloop
  709.  
  710.         move.l    pronetmsgport(pc),a0
  711.         LIBCALL    WaitPort
  712.         move.l    pronetmsgport(pc),a0
  713.         LIBCALL    GetMsg
  714.         move.l    d0,d6
  715.         move.l    d0,a0
  716.         move.l    MN_SIZE+2+4(a0),d2
  717.         move.l    MN_SIZE+2+8(a0),d3
  718.         move.l    d6,a1
  719.         LIBCALL    ReplyMsg
  720.         move.l    d2,d0
  721.         move.l    d3,d1
  722.  
  723. .return        move.l    a2,a0
  724.         bra    ReturnPacket
  725.  
  726. ACT_FINDxxx
  727.         GETsFL    dp_Arg2(a2),a0
  728.         move.l    a0,(a3)+
  729.         clr.w    (a3)+
  730.         move.l    dp_Arg3(a2),a0
  731.         bsr    copybfname
  732.         lea    .ret(pc),a0
  733.         bra    sendpnpacket
  734. .ret
  735.         movem.l    (a3)+,d0/d1
  736.         tst.w    d0
  737.         beq.s    .return
  738.         GETBPTR    dp_Arg1(a2),a0
  739.         move.l    (a3),fh_Arg1(a0)
  740.         move.l    #DOSTRUE,fh_Interactive(a0)
  741.         move.l    ourport(pc),fh_Type(a0)
  742. .return        move.l    a2,a0
  743.         bra    ReturnPacket
  744.  
  745. ACT_END
  746.         move.l    dp_Arg1(a2),(a3)+
  747.         lea    normalret(pc),a0
  748.         bra    sendpnpacket
  749.  
  750. ACT_SEEK
  751.         move.l    dp_Arg1(a2),(a3)+
  752.         move.l    dp_Arg2(a2),(a3)+
  753.         move.l    dp_Arg3(a2),(a3)+
  754.         lea    normalret(pc),a0
  755.         bra    sendpnpacket
  756.  
  757. ACT_FORMAT
  758.         move.l    dp_Arg2(a2),(a3)+
  759.         clr.w    (a3)+
  760.         move.l    dp_Arg1(a2),a0
  761.         bsr    copybstr
  762.         lea    normalret(pc),a0
  763.         bra    sendpnpacket
  764.  
  765. ACT_MAKE_LINK
  766.         move.l    dp_Arg4(a2),d2
  767.         move.l    d2,(a3)+
  768.         GETsFL    dp_Arg1(a2),a0
  769.         move.l    a0,(a3)+
  770.         cmp.l    #LINK_HARD,d2
  771.         beq.s    .hardlink
  772. .softlink    lea    256+2(a3),a5
  773.         move.l    dp_Arg3(a2),a0
  774.         bsr    copycstr
  775.         move.l    a5,a3
  776.         bra.s    .doit
  777. .hardlink    GETsFL    dp_Arg3(a2),a0
  778.         move.l    a0,(a3)+
  779.         clr.w    (a3)+
  780. .doit        move.l    dp_Arg2(a2),a0
  781.         bsr    copybfname
  782.         lea    normalret(pc),a0
  783.         bra    sendpnpacket
  784.  
  785. ACT_SET_FILE_SIZE
  786.         move.l    dp_Arg1(a2),(a3)+
  787.         move.l    dp_Arg2(a2),(a3)+
  788.         move.l    dp_Arg3(a2),(a3)+
  789.         lea    normalret(pc),a0
  790.         bra    sendpnpacket
  791.  
  792. ACT_WRITE_PROTECT
  793.         move.l    dp_Arg1(a2),(a3)+
  794.         move.l    dp_Arg2(a2),(a3)+
  795.         lea    normalret(pc),a0
  796.         bra    sendpnpacket
  797.  
  798. ACT_READ_LINK
  799.         GETsFL    dp_Arg1(a2),a0
  800.         move.l    a0,(a3)+
  801.         move.l    dp_Arg4(a2),(a3)+
  802.         move.l    dp_Arg2(a2),a0
  803.         bsr    copycstr
  804.         lea    .ret(pc),a0
  805.         bra    sendpnpacket
  806. .ret
  807.         movem.l    (a3)+,d0/d1
  808.         move.l    dp_Arg4(a2),d2
  809.         subq.w    #1,d2
  810.         move.l    dp_Arg3(a2),a1
  811. .copy        move.b    (a3)+,(a1)+
  812.         dbra    d2,.copy
  813.         move.l    a2,a0
  814.         bra    ReturnPacket
  815.  
  816. ACT_FH_FROM_LOCK
  817.         GETsFL    dp_Arg2(a2),a0
  818.         move.l    a0,(a3)+
  819.         lea    .ret(pc),a0
  820.         bra    sendpnpacket
  821. .ret
  822.         movem.l    (a3),d0/d1
  823.         tst.w    d0
  824.         beq.s    .return
  825.         GETBPTR    dp_Arg1(a2),a0
  826.         move.l    8(a3),fh_Arg1(a0)
  827.         move.l    #DOSTRUE,fh_Interactive(a0)
  828.         move.l    ourport(pc),fh_Type(a0)
  829.         GETBPTR    dp_Arg2(a2),a0
  830.         clr.l    fl_Task(a0)
  831.         move.l    a0,d1
  832.         bsr    ForgetLock
  833.         move.l    a5,a1
  834.         bsr    FreeVec
  835.         movem.l    (a3),d0/d1
  836. .return        move.l    a2,a0
  837.         bra    ReturnPacket
  838.  
  839. ACT_CHANGE_MODE
  840.         move.l    dp_Arg1(a2),d0
  841.         move.l    d0,(a3)+
  842.         cmp.l    #CHANGE_LOCK,d0
  843.         beq.s    .change_lock
  844. .change_fh    GETBPTR    dp_Arg2(a2),a0
  845.         move.l    fh_Arg1(a0),(a3)+
  846.         bra.s    .cont
  847. .change_lock    GETsFL    dp_Arg2(a2),a0
  848.         move.l    a0,(a3)+
  849. .cont        move.l    dp_Arg3(a2),(a3)+
  850.         lea    .ret(pc),a0
  851.         bra    sendpnpacket
  852. .ret
  853.         move.l    dp_Arg1(a2),d2
  854.         cmp.l    #CHANGE_LOCK,d2
  855.         bne.s    .0
  856.         GETBPTR    dp_Arg2(a2),a0
  857.         move.l    8(a3),fl_Access(a0)
  858. .0        bra    normalret
  859.  
  860.  
  861. ACT_COPY_DIR_FH
  862.         bra    ACT_PARENT_FH
  863.  
  864. ACT_PARENT_FH
  865.         move.l    dp_Arg1(a2),(a3)+
  866.         lea    copydir_ret(pc),a0
  867.         bra    sendpnpacket
  868.  
  869. ACT_LOCK_RECORD
  870.         move.l    dp_Arg1(a2),(a3)+
  871.         move.l    dp_Arg2(a2),(a3)+
  872.         move.l    dp_Arg3(a2),(a3)+
  873.         move.l    dp_Arg4(a2),(a3)+
  874.         move.l    dp_Arg5(a2),(a3)+
  875.         lea    normalret(pc),a0
  876.         bra    sendpnpacket
  877.  
  878. ACT_FREE_RECORD
  879.         move.l    dp_Arg1(a2),(a3)+
  880.         move.l    dp_Arg2(a2),(a3)+
  881.         move.l    dp_Arg3(a2),(a3)+
  882.         lea    normalret(pc),a0
  883.         bra    sendpnpacket
  884.         bra    ACT_NIL
  885.  
  886. ACT_ADD_NOTIFY
  887.         bra    ACT_NIL
  888.  
  889. ACT_REMOVE_NOTIFY
  890.         bra    ACT_NIL
  891.  
  892. ACT_SERIALIZE_DISK
  893.         lea    normalret(pc),a0
  894.         bra    sendpnpacket
  895.  
  896. ACT_INHIBIT
  897.         move.l    dp_Arg1(a2),(a3)+
  898.         lea    normalret(pc),a0
  899.         bra    sendpnpacket
  900.  
  901. ACT_INFO
  902.         GETsFL    dp_Arg1(a2),a0
  903.         move.l    a0,(a3)+
  904.         lea    .ret(pc),a0
  905.         bra    sendpnpacket
  906. .ret
  907.         movem.l    (a3)+,d0/d1
  908.         tst.w    d0
  909.         beq.s    .return
  910.         GETBPTR    dp_Arg2(a2),a0
  911.         move.l    a0,a4
  912.         moveq    #8,d0
  913. .copyl        move.l    (a3)+,(a0)+
  914.         dbra    d0,.copyl
  915.         move.l    id_VolumeNode(a4),d1
  916.         bsr    FindCorrVolume
  917.         move.l    d0,id_VolumeNode(a4)
  918.         moveq    #DOSTRUE,d0
  919. .return        move.l    a2,a0
  920.         bra    ReturnPacket
  921.  
  922. ACT_DISK_INFO
  923.         lea    .ret(pc),a0
  924.         bra    sendpnpacket
  925. .ret
  926.         movem.l    (a3)+,d0/d1
  927.         tst.w    d0
  928.         beq.s    .return
  929.         GETBPTR    dp_Arg1(a2),a0
  930.         move.l    a0,a4
  931.         moveq    #8,d0
  932. .copyl        move.l    (a3)+,(a0)+
  933.         dbra    d0,.copyl
  934.         move.l    id_VolumeNode(a4),d1
  935.         bsr    FindCorrVolume
  936.         move.l    d0,id_VolumeNode(a4)
  937.         moveq    #DOSTRUE,d0
  938. .return        move.l    a2,a0
  939.         bra    ReturnPacket
  940.  
  941. ACT_CURRENT_VOLUME
  942.         move.l    dp_Arg1(a2),(a3)+
  943.         beq.s    .shortcut
  944.         lea    .ret(pc),a0
  945.         bra    sendpnpacket
  946. .shortcut    move.l    curvolume(pc),d0
  947.         lsr.l    #2,d0
  948.         moveq    #7,d1
  949.         move.l    a2,a0
  950.         clr.l    actpacket
  951.         bra    ReturnPacket
  952. .ret
  953.         move.l    (a3),d1
  954.         bsr    FindCorrVolume
  955.         move.l    a2,a0
  956.         moveq    #7,d1
  957.         bra    ReturnPacket
  958.  
  959. ; -- zu einem BPTR auf die VolNode auf dem Server die passende VolNode
  960. ; -- auf dem Handler finden. Wenn sie nicht gefunden wird, wird 0 returnt
  961. FindCorrVolume    ; d1 BPTR->ServerVolNode or NULL
  962.         ; RETURNS d0 BPTR->VolNode or NULL
  963.         ;         a1 APTR->Corresponding PHVN
  964.         movem.l    a2/a3,-(sp)
  965.         moveq    #0,d0
  966.         tst.l    d1
  967.         beq.s    .end
  968.         lea    PHVNList(pc),a3
  969.         move.l    LH_HEAD(a3),a2
  970.         addq.w    #4,a3
  971. .nextphvn    cmp.l    a2,a3
  972.         beq.s    .end
  973.         move.l    a2,a1
  974.         move.l    LN_SUCC(a2),a2
  975.         cmp.l    phvn_srvdoslist(a1),d1
  976.         bne.s    .nextphvn
  977.         move.l    phvn_doslist(a1),d0
  978.         lsr.l    #2,d0
  979. .end        movem.l    (sp)+,a2/a3
  980.         rts
  981.  
  982. ; -- Lock in der Lockliste merken.
  983. RememberLock    ; d0 BPTR->Lock
  984.         ; a0 APTR->Lock
  985.         ; a1 APTR->corresponding PHVN
  986.         ; destroys a3 and a1
  987.         move.l    a3,-(sp)
  988.         move.l    a1,a3            ;Lock in die interne
  989.         lea    phvn_locklist(a3),a3    ;Lockliste eintragen
  990.         move.l    (a3),a1
  991.         move.l    a1,fl_Link(a0)
  992.         move.l    d0,(a3)
  993.         move.l    (sp)+,a3
  994.         rts
  995.  
  996. ; -- Lock aus der Lockliste streichen - und zwar alle PHVN's durchsehen !!
  997. ; -- außerdem VolumeNode entfernen, falls LockListe leer und Volume entfernt!
  998. ForgetLock    ; d1 BPTR->Lock
  999.         ; RETURNS d1 Lock removed from List or 0 if not in List
  1000.         ;         a5 APTR->Lock or undefined if not in List
  1001.         ; DESTROYS a0,a1,d0,d1,a5
  1002.         movem.l    a2/a3/a4/d2/d3,-(sp)
  1003.         lea    PHVNList(pc),a3
  1004.         move.l    LH_HEAD(a3),a2
  1005.         addq.w    #4,a3
  1006. .nextphvn    cmp.l    a2,a3
  1007.         beq.s    .error
  1008.         move.l    a2,a4
  1009.         move.l    LN_SUCC(a2),a2
  1010.                         ;Ist dieser Lock in unserer
  1011.         lea    phvn_locklist(a4),a0    ;Liste ??
  1012. .searchlock    move.l    a0,a1
  1013.         move.l    (a0),a0
  1014.         move.l    a0,d0
  1015.         beq.s    .nextphvn  ;nicht in dieser Liste -> nächste Volume
  1016.         cmp.l    d1,d0
  1017.         beq.s    .lockok
  1018.         add.l    a0,a0
  1019.         add.l    a0,a0
  1020.         bra.s    .searchlock
  1021. .lockok        move.l    d1,a5
  1022.         add.l    a5,a5
  1023.         add.l    a5,a5
  1024.         move.l    (a5),(a1)    ;Lock aus der Liste löschen
  1025.  
  1026.         tst.l    phvn_locklist(a4)    ;VolumeNode löschen ???
  1027.         bne.s    .ende
  1028.         move.l    phvn_doslist(a4),a0
  1029.         tst.l    dol_Task(a0)
  1030.         bne.s    .ende
  1031.         move.l    d1,-(sp)        ;jo.
  1032.         move.l    a4,a2
  1033.         bsr    RemoveVolNode
  1034.         move.l    (sp)+,d1
  1035.         bra.s    .ende
  1036.  
  1037. .error        moveq    #0,d1
  1038. .ende        movem.l    (sp)+,a2/a3/a4/d2/d3
  1039.         rts
  1040.  
  1041. ; -- Normale Abschlußsequenz - nur Results werden zurückgeliefert.
  1042. normalret    movem.l    (a3)+,d0/d1
  1043.         move.l    a2,a0
  1044.         bra    ReturnPacket
  1045.  
  1046. ; -- Kopiert BSTR nach (a3)+, dabei wird Filename bis ':' abgeschnitten
  1047. ; -- (Wenn kein ':' existiert, wird alles so belassen..)
  1048. copybfname    ; a0 BPTR to BSTR
  1049.         ; a3 *space
  1050.         move.l    a0,d0
  1051.         beq.s    .empty
  1052.         move.l    a0,a1
  1053.         add.l    a0,a0
  1054.         add.l    a0,a0
  1055.         moveq    #0,d0
  1056.         move.b    (a0)+,d0
  1057.         subq.w    #1,d0
  1058.         bmi.s    .empty
  1059. .0        move.b    (a0)+,d1
  1060.         cmp.b    #":",d1
  1061.         dbeq    d0,.0
  1062.         bne.s    .normalcopy
  1063.         move.b    d0,(a3)+
  1064.         beq.s    .ende
  1065. .1        move.b    (a0)+,(a3)+
  1066.         dbra    d0,.1
  1067. .ende        rts
  1068. .normalcopy    move.l    a1,a0
  1069.         bra.s    copybstr
  1070. .empty        clr.b    (a3)+
  1071.         rts
  1072.  
  1073. ; -- Kopiert BSTR nach (a3)+
  1074. copybstr    ; a0 BPTR to BSTR
  1075.         ; a3 *space
  1076.         move.l    a0,d0
  1077.         beq.s    .empty
  1078.         add.l    a0,a0
  1079.         add.l    a0,a0
  1080.         moveq    #0,d1
  1081.         move.b    (a0),d1
  1082. .copybstr    move.b    (a0)+,(a3)+
  1083.         dbra    d1,.copybstr
  1084.         rts
  1085. .empty        clr.b    (a3)+
  1086.         rts
  1087.  
  1088. ; -- Kopiert C-String nach (a3)+
  1089. copycstr    ; a0 APTR to C-String
  1090.         ; a3 *space
  1091.         move.b    (a0)+,(a3)+
  1092.         bne.s    copycstr
  1093.         rts
  1094.  
  1095. ; -- Sendet Packet zum Server
  1096. sendpnpacket    ; a3 end of sendbuf
  1097.         ; a4 *PNRequest
  1098.         ; a0 Routine, die angesprungen wird, wenn Antwort vom
  1099.         ;    Server kommt.
  1100.         move.l    4.w,a6
  1101.         move.l    a0,actanswerroutine
  1102.         lea    sendbuf,a0
  1103.         sub.l    a0,a3
  1104.         move.l    a4,a1
  1105.         move.l    a0,pnr_Data1(a1)
  1106.         move.l    a3,pnr_Length1(a1)
  1107.         LIBJMP    DoIO
  1108.  
  1109. ; === Packets, die ohne den Server erledigt werden:
  1110.  
  1111. ACT_NIL
  1112.     IFNE    DEBUG
  1113.     lea    dunknownt(pc),a0
  1114.     bsr    dtype
  1115.     ENDC
  1116.         move.l    a2,a0
  1117.         move.l    #DOSFALSE,d0
  1118.         move.l    #ERROR_ACTION_NOT_KNOWN,d1
  1119.         clr.l    actpacket
  1120.         bra    ReturnPacket
  1121.  
  1122. ACT_IS_FILESYSTEM
  1123.         move.l    a2,a0
  1124.         moveq    #DOSTRUE,d0
  1125.         moveq    #0,d1
  1126.         clr.l    actpacket
  1127.         bra    ReturnPacket
  1128.  
  1129. ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1130. ; === Wird angesprungen, wenn DiskChange-Message vom Server kommt:
  1131. ; a3 *data nach dp_Action
  1132. ACT_DISKINS
  1133.         ;erstmal prüfen, ob wir diese Disk schon irgendwo
  1134.         ;gespeichert haben in der PHVNList..
  1135.         move.l    (a3)+,d7
  1136.         move.l    d7,d1
  1137.         bsr    FindCorrVolume
  1138.         tst.l    d0
  1139.         beq.s    .newvol
  1140.  
  1141.         ;wenn ja, dann keine neue VolumeNode, sondern nur
  1142.         ;dol_Task und dol_LockList, curvolume und curphvn
  1143.         ;wiederherstellen !!!
  1144.         move.l    a1,curphvn
  1145.         move.l    phvn_doslist(a1),a2
  1146.         move.l    a2,curvolume
  1147.         move.l    4.w,a6
  1148.         LIBCALL    Forbid
  1149.         clr.l    dol_LockList(a2)
  1150.         move.l    ourport(pc),dol_Task(a2)
  1151.         LIBCALL    Permit
  1152.         move.b    #IECLASS_DISKINSERTED,d2
  1153.         bra    SendInputEvent
  1154.  
  1155. .newvol        moveq    #44,d0        ;neue VolumeNode erstellen..
  1156.         bsr    AllocVec
  1157.         move.l    d0,curvolume
  1158.         move.l    d0,a2
  1159.         lea    dol_VolumeDate(a2),a0
  1160.         move.l    (a3)+,(a0)+
  1161.         move.l    (a3)+,(a0)+
  1162.         move.l    (a3)+,(a0)
  1163.         moveq    #0,d0
  1164.         move.b    (a3),d0
  1165.         addq.l    #3,d0
  1166.         bsr    AllocVec
  1167.         move.l    d0,a0
  1168.         lsr.l    #2,d0
  1169.         move.l    d0,dol_Name(a2)
  1170.         moveq    #0,d0
  1171.         move.b    (a3),d0
  1172.  
  1173.         tst.w    plusflag
  1174.         beq.s    .copyname
  1175.         addq.w    #1,d0
  1176.         move.b    d0,(a0)+
  1177.         move.b    plusflag(pc),(a0)+
  1178.         subq.w    #2,d0
  1179.         addq.w    #1,a3
  1180.  
  1181. .copyname    move.b    (a3)+,(a0)+
  1182.         dbra    d0,.copyname
  1183.         move.l    #DLT_VOLUME,dol_Type(a2)
  1184.         move.l    ourport(pc),dol_Task(a2)
  1185.         move.l    #ID_DOS_DISK,dl_DiskType(a2)
  1186.         move.l    4.w,a6
  1187.         LIBCALL    Forbid
  1188.         move.l    dosbase(pc),a1
  1189.         move.l    dl_Root(a1),a1
  1190.         move.l    rn_Info(a1),a1
  1191.         add.l    a1,a1
  1192.         add.l    a1,a1
  1193.         addq.w    #di_DevInfo,a1
  1194.         move.l    (a1),(a2)
  1195.         move.l    a2,d0
  1196.         lsr.l    #2,d0
  1197.         move.l    d0,(a1)
  1198.         LIBCALL    Permit
  1199.         moveq    #phvn_SIZEOF,d0
  1200.         bsr    AllocVec
  1201.         move.l    d0,curphvn
  1202.         move.l    d0,a2
  1203.         move.l    curvolume(pc),phvn_doslist(a2)
  1204.         move.l    d7,phvn_srvdoslist(a2)
  1205.         move.l    a2,a1
  1206.         lea    PHVNList(pc),a0
  1207.         LIBCALL    AddTail
  1208.         move.b    #IECLASS_DISKINSERTED,d2
  1209.         bra    SendInputEvent
  1210.  
  1211. ACT_DISKREM
  1212.         move.l    4.w,a6
  1213.         move.l    curvolume(pc),d2
  1214.         tst.l    d2
  1215.         beq.s    .ende    ;falscher Alarm..
  1216.         move.l    curphvn(pc),a2
  1217.         ; [d2] *doslist [a2] *phvn
  1218.         ; Wenn LockList = 0, dann rausschmeißen + VolNode löschen
  1219.         ; Wenn nicht, dann dol_Task löschen und dol_LockList setzen.
  1220.         ; Auf jeden Fall curvolume löschen.
  1221.         clr.l    curvolume
  1222.         clr.l    curphvn
  1223.         move.l    phvn_locklist(a2),d3
  1224.         beq.s    .clearall
  1225.         LIBCALL    Forbid
  1226.         move.l    d2,a3
  1227.         clr.l    dol_Task(a3)
  1228.         move.l    d3,dol_LockList(a3)
  1229.         LIBCALL    Permit
  1230.         bra.s    .return
  1231.  
  1232. .clearall    bsr    RemoveVolNode
  1233.  
  1234. .return        move.b    #IECLASS_DISKREMOVED,d2
  1235.         bra    SendInputEvent
  1236. .ende        rts
  1237.  
  1238. ; -- VolumeNode und PHVN entfernen.
  1239. RemoveVolNode    ; a2 *corresponding PHVN
  1240.         movem.l    a4/a6/d2/d3,-(sp)
  1241.         move.l    4.w,a6
  1242.         move.l    phvn_doslist(a2),d2
  1243.         LIBCALL    Forbid
  1244.         move.l    dosbase(pc),a1
  1245.         move.l    dl_Root(a1),a1
  1246.         move.l    rn_Info(a1),a1
  1247.         add.l    a1,a1
  1248.         add.l    a1,a1
  1249.         addq.w    #di_DevInfo,a1
  1250. .removeloop    move.l    a1,a4        ;letztes Element merken
  1251.         move.l    (a1),a1
  1252.         add.l    a1,a1
  1253.         add.l    a1,a1
  1254.         cmp.l    d2,a1
  1255.         bne.s    .removeloop
  1256.         ;gefunden
  1257.         move.l    a1,d3
  1258.         move.l    (a1),(a4)    ;Node rausnehmen.
  1259.         LIBCALL    Permit
  1260.         move.l    d3,a1
  1261.         bsr    FreeVec
  1262.         move.l    a2,a1        ;PHVolumeNode rausnehmen.
  1263.         LIBCALL    Remove
  1264.         move.l    a2,a1
  1265.         bsr    FreeVec
  1266.         movem.l    (sp)+,a4/a6/d2/d3
  1267.         rts
  1268.  
  1269. ; -- Compare two null-terminated strings. Case-insensitive
  1270. CompareStrings    ; a0 *String1
  1271.         ; a1 *String2
  1272.         ; RETURNS d0 = 0 --> Strings equal
  1273.         move.l    d2,-(sp)
  1274.         moveq    #-1,d0
  1275. .loop        move.b    (a0)+,d1
  1276.         move.b    (a1)+,d2
  1277.         bclr    #5,d1
  1278.         bclr    #5,d2
  1279.         cmp.b    d1,d2
  1280.         bne.s    .ende
  1281.         tst.b    d1
  1282.         bne.s    .loop
  1283.         moveq    #0,d0
  1284. .ende        move.l    (sp)+,d2
  1285.         rts
  1286.  
  1287.         include    "A:ProNET/source/dospackets.s"
  1288.         include    "A:ProNET/source/devio.s"
  1289.  
  1290. ; -- Sends an Input Event.
  1291. SendInputEvent    ; d2.b IECLASS
  1292.         movem.l    d2-d7/a2-a6,-(sp)
  1293.         moveq    #IOTV_SIZE,d0
  1294.         bsr    GetIORequest
  1295.         move.l    d0,a4    ;TimerRequest
  1296.         moveq    #IOSTD_SIZE,d0
  1297.         bsr    GetIORequest
  1298.         move.l    d0,a5    ;InputRequest
  1299.         move.l    4.w,a6
  1300.         lea    timername(pc),a0
  1301.         moveq    #0,d0
  1302.         moveq    #0,d1
  1303.         move.l    a4,a1
  1304.         LIBCALL    OpenDevice
  1305.         lea    inputname(pc),a0
  1306.         moveq    #0,d0
  1307.         moveq    #0,d1
  1308.         move.l    a5,a1
  1309.         LIBCALL    OpenDevice
  1310.  
  1311.         move.l    a4,a1
  1312.         move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  1313.         LIBCALL    DoIO
  1314.  
  1315.         lea    localbuf,a3
  1316.         clr.l    ie_NextEvent(a3)
  1317.         move.b    d2,ie_Class(a3)
  1318.         clr.b    ie_SubClass(a3)
  1319.         clr.w    ie_Code(a3)
  1320.         move.w    #IEQUALIFIER_MULTIBROADCAST,ie_Qualifier(a3)
  1321.         clr.l    ie_EventAddress(a3)
  1322.         move.l    IOTV_TIME(a4),ie_TimeStamp(a3)
  1323.         move.l    IOTV_TIME+4(a4),ie_TimeStamp+4(a3)
  1324.         move.w    #IND_WRITEEVENT,IO_COMMAND(a5)
  1325.         move.w    #ie_SIZEOF,IO_LENGTH(a5)
  1326.         move.l    a3,IO_DATA(a5)
  1327.         move.l    a5,a1
  1328.         LIBCALL    DoIO        ;InputEvent abschicken..
  1329.  
  1330.         move.l    a5,a1
  1331.         LIBCALL    CloseDevice
  1332.         move.l    a4,a1
  1333.         LIBCALL    CloseDevice
  1334.         move.l    a5,a0
  1335.         bsr    FreeIORequest
  1336.         move.l    a4,a0
  1337.         bsr    FreeIORequest
  1338.         movem.l    (sp)+,d2-d7/a2-a6
  1339.         rts
  1340.  
  1341. ; -- AllocVec stub - requirements fixed to PUBLIC|CLEAR
  1342. AllocVec    ; d0 bytesize
  1343.         move.l    a6,-(sp)
  1344.         move.l    4.w,a6
  1345.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  1346.         LIBCALL    AllocVec
  1347.         move.l    (sp)+,a6
  1348.         rts
  1349.  
  1350. ; -- FreeVec stub
  1351. FreeVec        ; a1 memory-block
  1352.         move.l    a6,-(sp)
  1353.         move.l    4.w,a6
  1354.         LIBCALL    FreeVec
  1355.         move.l    (sp)+,a6
  1356.         rts
  1357.  
  1358.     IFNE    DEBUG
  1359.     include "A:OSdebugging.s"
  1360. dunknownt    dc.b    "Unknown Dos Packet Type !",0
  1361. dwritet        dc.b    "ACTION_WRITE: ",0
  1362.     even
  1363. debok    dc.w    0
  1364.     ENDC
  1365.  
  1366. ;----------------------------------------------------------------------------
  1367.  
  1368. dosname        dc.b    "dos.library",0
  1369. inputname    dc.b    "input.device",0
  1370. timername    dc.b    "timer.device",0
  1371.         even
  1372.  
  1373. curvolume    dc.l    0    ;aktuelle Volumenode..
  1374. curphvn        dc.l    0    ;aktuelle PHVolumeNode..
  1375.  
  1376. plusflag    dc.w    0
  1377. dosbase        dc.l    0
  1378. pronetio    dc.l    0
  1379. pronetmsgport    dc.l    0
  1380. actpronetmsg    dc.l    0
  1381. ourprocess    dc.l    0
  1382. ourport        dc.l    0
  1383. devnode        dc.l    0
  1384. startuppacket    dc.l    0
  1385. actpacket    dc.l    0
  1386. actanswerroutine dc.l    0
  1387.  
  1388. ; -- ExecList; speichert alle Volumes und dazugehörige FileLocks.
  1389. PHVNList    dc.l    *+4,0,PHVNList
  1390.  
  1391.  
  1392.  
  1393.         section    b,bss
  1394.  
  1395. sendbuf        ds.b    $400
  1396. localbuf    ds.b    128    ;kann benutzen wer will, nur temporäre Daten!
  1397.